package pe.gob.mininter.dirandro.vaadin.panel.inteligencia;

import java.util.List;

import org.apache.log4j.Logger;

import pe.gob.mininter.dirandro.model.DetZonaCultivo;
import pe.gob.mininter.dirandro.model.Inteligencia;
import pe.gob.mininter.dirandro.model.ZonaCultivo;
import pe.gob.mininter.dirandro.service.DetalleZonaCultivoService;
import pe.gob.mininter.dirandro.service.ZonaCultivoService;
import pe.gob.mininter.dirandro.util.HarecUtil;
import pe.gob.mininter.dirandro.vaadin.panel.util.PanelAgregarZonaCultivo;
import pe.gob.mininter.dirandro.vaadin.util.Injector;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Item;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.ui.AbstractSelect.Filtering;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Table;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;

public class PanelRegistroInteligenciaCultivo extends CustomComponent  implements ClickListener {

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	@AutoGenerated
	private VerticalLayout mainLayout;
	@AutoGenerated
	private VerticalLayout pnlPrincipal;
	@AutoGenerated
	private Table tblCultivo;
	@AutoGenerated
	private HorizontalLayout horizontalLayout_1;
	@AutoGenerated
	private Button btnAgregar;
	@AutoGenerated
	private Button btnNuevo;
	@AutoGenerated
	private ComboBox cmbCultivo;
	@AutoGenerated
	private Label label_1;
	private IndexedContainer container;
	private Inteligencia inteligencia;
	private boolean inicializado=false;
	private DetZonaCultivo zonaCultivo; 
	private PanelAgregarZonaCultivo panelAgregarZonaCultivo;
	private List<DetZonaCultivo> lstZonaCultivo;
	private ZonaCultivoService zonaCultivoService;
	private DetalleZonaCultivoService detalleZonaCultivoService;
	
	private static final Logger logger = Logger.getLogger(PanelRegistroInteligenciaCultivo.class);
	
	
	
	public Inteligencia getInteligencia() {
		return inteligencia;
	}

	public void setInteligencia(Inteligencia inteligencia) {
		this.inteligencia = inteligencia;
		System.out.println("seteada inteligencia");
		postConstruct();
	}

	/**
	 * The constructor should first build the main layout, set the
	 * composition root and then do any custom initialization.
	 *
	 * The constructor will not be automatically regenerated by the
	 * visual editor.
	 */
	public PanelRegistroInteligenciaCultivo() {
		buildMainLayout();
		setCompositionRoot(mainLayout);
		
		zonaCultivoService = Injector.obtenerServicio(ZonaCultivoService.class);
		detalleZonaCultivoService = Injector.obtenerServicio(DetalleZonaCultivoService.class);
		
		cmbCultivo.setInputPrompt("Zona de Cultivo");
		postConstruct();
		limpiar();
	}

	private void postConstruct(){
		if(inteligencia!=null && !inteligencia.esNuevo() && !inicializado){
			
			cmbCultivo.setInputPrompt("Zona de Cultivo");
			cmbCultivo.setItemCaptionPropertyId("id");
			actualizaListaZonas();
			
			container = new IndexedContainer();
			container.addContainerProperty("id", Long.class, null);
			container.addContainerProperty("zona", ZonaCultivo.class, null);
			container.addContainerProperty("zona.tipo", String.class, null);
			container.addContainerProperty("zona.hectareas", String.class, null);
			container.addContainerProperty("zona.ubicacion", String.class, null);
			container.addContainerProperty("zona.id", Long.class, null);
			
			tblCultivo.setSelectable(true);
			tblCultivo.setImmediate(true);
			tblCultivo.setNullSelectionAllowed(true);
			tblCultivo.setNullSelectionItemId(null);
			tblCultivo.addListener(new ValueChangeListener() {
				
				private static final long serialVersionUID = -3416533772693474159L;
	
				@Override
				public void valueChange(ValueChangeEvent event) {
					boolean esModoNuevo = tblCultivo.getValue() == null;
					limpiar();
					habilitarEdicion(!esModoNuevo);
					if (!esModoNuevo) {
						Item item = tblCultivo.getItem(tblCultivo.getValue());
						
						zonaCultivo.setId((Long) item.getItemProperty("id").getValue());
						cmbCultivo.select((ZonaCultivo) item.getItemProperty("zona").getValue());
					}
				}
			});
			
			btnAgregar.addListener((ClickListener)this);
			btnNuevo.addListener((ClickListener)this);
			
			llenaPanel();
			
			limpiar();
			habilitarEdicion(false);
			inicializado=true;
		}	
	}
	
	@Override
	public void buttonClick(ClickEvent event) {
		logger.debug("clic ");
		if(event.getButton().equals(btnAgregar)) {
			logger.debug("agregarrr ");
			zonaCultivo.setZonaCultivo((ZonaCultivo)cmbCultivo.getValue());
			
			if(zonaCultivo.esNuevo()){
				detalleZonaCultivoService.crear(zonaCultivo);
			}else{
				detalleZonaCultivoService.actualizar(zonaCultivo);
			}
			
			limpiar();
			llenaPanel();
			return;
			
		}
		if(event.getButton().equals(btnNuevo)) {
			logger.debug("nuevo abre panel");
			panelAgregarZonaCultivo = new PanelAgregarZonaCultivo();

			Window window=new Window(){
				
				private static final long serialVersionUID = 1L;

				  protected void close() {
					  getApplication().getMainWindow().removeWindow(getWindow());
				  }
				  @Override
					public void detach() {
					  
					  actualizaListaZonas();
					  if(panelAgregarZonaCultivo.getZonaCultivo()!=null)
							cmbCultivo.select(panelAgregarZonaCultivo.getZonaCultivo());
						
					}
			};
			window.setCaption("Registrar Zona de Cultivo");
			window.addComponent(panelAgregarZonaCultivo);
			window.setModal(true);
			window.setResizable(false);
			window.setWidth("550px");
			window.setHeight("-1px");
			getApplication().getMainWindow().addWindow(window);

			return;
		}
	}
	
	
	private void llenaPanel(){
		DetZonaCultivo detGrem = new DetZonaCultivo();
		detGrem.setInteligencia(inteligencia);
		lstZonaCultivo = detalleZonaCultivoService.buscar(detGrem);
		container.removeAllItems();
		int con=1;
		if ( lstZonaCultivo != null) {
	    	 for (DetZonaCultivo zona: lstZonaCultivo) {
	             Item item = container.addItem(con++);
	             item.getItemProperty("id").setValue(zona.getId());
	             item.getItemProperty("zona").setValue(zona.getZonaCultivo());
	             item.getItemProperty("zona.id").setValue(zona.getZonaCultivo().getId());
	             item.getItemProperty("zona.tipo").setValue(HarecUtil.valorNombreToEmpty(zona.getZonaCultivo().getTipoCultivo()));
	             item.getItemProperty("zona.hectareas").setValue(HarecUtil.nullToEmpty(zona.getZonaCultivo().getHectareas()));
	             item.getItemProperty("zona.ubicacion").setValue(zona.getZonaCultivo().getDistrito()!=null?zona.getZonaCultivo().getDistrito().getNombreCompleto():"");
	           				
	        }
	    }
		
		tblCultivo.setContainerDataSource(container);
		tblCultivo.setVisibleColumns(new Object[]{"zona.id","zona.tipo","zona.ubicacion","zona.hectareas"});

	}
	
	public void actualizaListaZonas() {
		cmbCultivo.setContainerDataSource(new BeanItemContainer<ZonaCultivo>(ZonaCultivo.class,  zonaCultivoService.buscar(null)));
		cmbCultivo.setItemCaptionPropertyId("nombreCompleto");
		cmbCultivo.setFilteringMode(Filtering.FILTERINGMODE_CONTAINS);
		cmbCultivo.setImmediate(true);
	}
	
	private void limpiar(){
		zonaCultivo = new DetZonaCultivo();
		zonaCultivo.setInteligencia(inteligencia);
		cmbCultivo.select(null);
	}


	private void habilitarEdicion(boolean flag){
		if(flag){
			btnAgregar.setCaption("Actualizar");
		}
		else{
			btnAgregar.setCaption("Registrar");
		}
	}
	
	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("100%");
		mainLayout.setMargin(true);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("100.0%");
		
		// pnlPrincipal
		pnlPrincipal = buildPnlPrincipal();
		mainLayout.addComponent(pnlPrincipal);
		
		return mainLayout;
	}

	@AutoGenerated
	private VerticalLayout buildPnlPrincipal() {
		// common part: create layout
		pnlPrincipal = new VerticalLayout();
		pnlPrincipal.setImmediate(false);
		pnlPrincipal.setWidth("-1px");
		pnlPrincipal.setHeight("-1px");
		pnlPrincipal.setMargin(false);
		pnlPrincipal.setSpacing(true);
		
		// label_1
		label_1 = new Label();
		label_1.setImmediate(false);
		label_1.setWidth("-1px");
		label_1.setHeight("-1px");
		label_1.setValue("Referencia del Documento Inteligencia:");
		pnlPrincipal.addComponent(label_1);
		
		// horizontalLayout_1
		horizontalLayout_1 = buildHorizontalLayout_1();
		pnlPrincipal.addComponent(horizontalLayout_1);
		
		// tblCultivo
		tblCultivo = new Table();
		tblCultivo.setImmediate(false);
		tblCultivo.setWidth("600px");
		tblCultivo.setHeight("200px");
		pnlPrincipal.addComponent(tblCultivo);
		
		return pnlPrincipal;
	}

	@AutoGenerated
	private HorizontalLayout buildHorizontalLayout_1() {
		// common part: create layout
		horizontalLayout_1 = new HorizontalLayout();
		horizontalLayout_1.setImmediate(false);
		horizontalLayout_1.setWidth("-1px");
		horizontalLayout_1.setHeight("-1px");
		horizontalLayout_1.setMargin(false);
		horizontalLayout_1.setSpacing(true);
		
		// cmbCultivo
		cmbCultivo = new ComboBox();
		cmbCultivo.setImmediate(false);
		cmbCultivo.setWidth("-1px");
		cmbCultivo.setHeight("-1px");
		horizontalLayout_1.addComponent(cmbCultivo);
		
		// btnNuevo
		btnNuevo = new Button();
		btnNuevo.setCaption("Nuevo");
		btnNuevo.setImmediate(true);
		btnNuevo.setWidth("-1px");
		btnNuevo.setHeight("-1px");
		horizontalLayout_1.addComponent(btnNuevo);
		
		// btnAgregar
		btnAgregar = new Button();
		btnAgregar.setCaption("Agregar");
		btnAgregar.setImmediate(true);
		btnAgregar.setWidth("-1px");
		btnAgregar.setHeight("-1px");
		horizontalLayout_1.addComponent(btnAgregar);
		
		return horizontalLayout_1;
	}

}
